#ifndef MOCK_GUARD
#define MOCK_GUARD
#include "SPA_Data_Types.h"
#include "StatTable.h"
#include "VarTable.h"
#include "ProcTable.h"
#include "ModifyVarTable.h"
#include "ModifyStatTable.h"
#include "UsesStatTable.h"
#include "UsesVarTable.h"
#include "ModifyProcTable.h"
#include "UsesProcTable.h"
#include "CallsTable.h"
#include<string>
#include<list>

using namespace std;

class Mock{
private:
	StatTable* stat;
	VarTable* var;
	ProcTable* proc;
	ModifyVarTable* modvar;
	ModifyStatTable* modstat;
	UsesVarTable* usevar;
	UsesStatTable* usestat;
	ModifyProcTable* modproc;
	UsesProcTable* useproc;
	CallsTable* call;

public:
	Mock();

	int getAll(list<string>&,int type);
	int getWith(Result& result, Argument arg1, Argument arg2);
	//Functions to get the information about the entity in the query
	int validateEntity(int num, int type); //validate stmtnum and constant
	int getEntityTypeIndex(string e, int& type);
	int getEntityIndex(string e,int type);
	string getEntityName(int index,int type);

	//Functions to get follows and follows*
	int getFollow(vector<int>&, vector<int>&, Argument, Argument);
	int getFollowT(vector<int>&, vector<int>&, Argument, Argument);
	int getFollowing(vector<int>&, vector<int>&,int , int, int);
	int getFollowingT(vector<int>&, vector<int>&, int , int, int);
	int getFollowedby(vector<int>&, vector<int>&, int , int, int);
	int getFollowedbyT(vector<int>&, vector<int>&,int , int, int);

	//Functions to get Parent and Parent*
	int getParent(vector<int>&,vector<int>&, Argument, Argument);
	int getParentT(vector<int>&,vector<int>&, Argument, Argument);
	int getPar(vector<int>&,vector<int>&,int , int, int);
	int getParT(vector<int>&,vector<int>&,int , int, int);
	int getChild(vector<int>&,vector<int>&,int , int, int);
	int getChildT(vector<int>&,vector<int>&,int , int, int);


	//Functions to get Modify
	int getModify(vector<int>&,vector<int>&, Argument, Argument);
	int getModifies(vector<int>&,vector<int>&, Argument, Argument);
	int getModifiedBy(vector<int>&,vector<int>&, Argument, Argument);

	//Functions to get Uses
	int getUses(vector<int>&,vector<int>&, Argument, Argument);
	int getUsess(vector<int>&,vector<int>&, Argument, Argument);
	int getUsedBy(vector<int>&,vector<int>&, Argument, Argument);

	//Functions to get Calls and Calls*
	int getCalls(vector<int>&,vector<int>&, Argument, Argument);
	int getCallsT(vector<int>&,vector<int>&, Argument, Argument);

};

#endif

